/*
 *  Copyright (C) 2010 Glauco
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.balisunrise.common;

import org.balisunrise.annotation.FilterType;

/**
 * Esta inteface disponibiliza dados suficientes para construir uma expressão que
 * funcionará como condição em uma busca ao Banco de Dados.
 * @author Glauco
 * @version 1.0
 */
public interface Criterion extends Basic{

	/**
	 * Retona o nome do atributo de uma entidade.
	 */
	public String getFieldName();

	/**
	 * Retona um Array com os nomes dos atributos para relacionar a entidade em que
	 * quer se realizar a pesquisa e a entidade listada na pesquisa.
	 */
	public String[] getPreNames();

	/**
	 * Adiciona um Pré-Name
	 * 
	 * @param preName
	 */
	public void addPreName(String preName);

	/**
	 * Retorna o valor que será usado para filtrar uma pesquisa.
	 */
	public Object getValue();

	/**
	 * Atribui o valor que será usado para filtrar uma pesquisa.
	 * 
	 * @param value
	 */
	public void setValue(Object value);

	/**
	 * Retorna um segundo valor usado para o filtra.
	 * Utilizado em situações com filtro "Entre Uma Faixa de Valores".
	 */
	public Object getOtherValue();

	/**
	 * Atribui um segundo valor para ser utilizado no filtro.
	 * 
	 * @param otherValue
	 */
	public void setOtherValue(Object otherValue);

	/**
	 * Retorna o tipo do Filtro.
	 */
	public FilterType getFilterType();

	/**
	 * Atribui o tipo do filtro.
	 * 
	 * @param filterType
	 */
	public void setFilterType(FilterType filterType);

	/**
	 * Retorna se o filtro deve ser desconciderado se o valor for nulo.
	 */
	public boolean isEmptyForAll();

	/**
	 * Atribui se o filtro deve ser desconciderado se o valor for nulo.
	 * 
	 * @param emptyForAll
	 */
	public void setEmptyForAll(boolean emptyForAll);

}